library(igraph)
## 
## Attaching package: 'igraph'
## The following objects are masked from 'package:stats':
## 
##     decompose, spectrum
## The following object is masked from 'package:base':
## 
##     union
library(knitr)
#library(xlsx)
fulldata <- read.csv("peoplepickinganonymised.csv")
dffrmatrix <- fulldata[,4:63]
frmatrix <- as.matrix(dffrmatrix)
G <- graph_from_adjacency_matrix(frmatrix, mode = "directed",add.colnames = TRUE, diag=FALSE)

Plotting

basic plot with R

coords <- layout_(G, nicely())
plot(G, vertex.size=12, edge.arrow.size=0.2)

Plot with some more parameters

plot(G, vertex.size=15, edge.arrow.size=0.2, edge.width=0.2, vertex.label.cex=0.42, vertex.label.color="white", vertex.color="darkblue",
     vertex.label.family="Helvetica")

Random layout

plot(G, layout = layout_randomly, vertex.size=15, edge.arrow.size=0.2, edge.width=0.2, vertex.label.cex=0.42, vertex.label.color="white", vertex.color="darkblue",
     vertex.label.family="Helvetica")

Sphere layout

l <- layout_on_sphere(G)
plot(G, layout=l, vertex.size=15, edge.arrow.size=0.2, edge.width=0.2, vertex.label.cex=0.42, vertex.label.color="white", vertex.color="darkblue",
     vertex.label.family="Helvetica")

Kamada-Kawai layout (quite nice I think)

l <- layout_with_kk(G)
plot(G, layout=l, vertex.size=15, edge.arrow.size=0.2, edge.width=0.2, vertex.label.cex=0.42, vertex.label.color="white", vertex.color="darkblue",
     vertex.label.family="Helvetica")

Fruchterman Reingold layout (best for displaying communities and cliques)

l <-layout.fruchterman.reingold(G)
plot(G, layout=l, vertex.size=15, edge.arrow.size=0.2, edge.width=0.2, vertex.label.cex=0.42, vertex.label.color="white", vertex.color="darkblue",
     vertex.label.family="Helvetica")

Communities

com <- cluster_spinglass(G, spin=5)
V(G)$color <- com$membership+1
G <- set_graph_attr(G, "layout", layout.fruchterman.reingold(G))
plot(G, vertex.size=15, edge.arrow.size=0.2, edge.width=0.2, vertex.label.cex=0.42, vertex.label.color="white", vertex.label.family="Helvetica")

com <- cluster_edge_betweenness(G)
V(G)$color <- com$membership+1
G <- set_graph_attr(G, "layout", layout.fruchterman.reingold(G))
plot(G, vertex.size=15, edge.arrow.size=0.2, edge.width=0.2, vertex.label.cex=0.42, vertex.label.color="white", vertex.label.family="Helvetica")

com <- cluster_leading_eigen(G)
## Warning in .Call("R_igraph_community_leading_eigenvector", graph, steps, :
## At community.c:1565 :This method was developed for undirected graphs
V(G)$color <- com$membership+1
G <- set_graph_attr(G, "layout", layout.fruchterman.reingold(G))
plot(G, vertex.size=15, edge.arrow.size=0.2, edge.width=0.2, vertex.label.cex=0.42, vertex.label.color="white", vertex.label.family="Helvetica")

com <- cluster_walktrap(G)
V(G)$color <- com$membership+1
G <- set_graph_attr(G, "layout", layout.fruchterman.reingold(G))
plot(G, vertex.size=15, edge.arrow.size=0.2, edge.width=0.2, vertex.label.cex=0.42, vertex.label.color="white", vertex.label.family="Helvetica")

Fast Greedy clustering (treats as undirected)

cfg <- cluster_fast_greedy(as.undirected(G))

plot(cfg, as.undirected(G), vertex.size=15, edge.arrow.size=0.2, edge.width=0.2, vertex.label.cex=0.42, vertex.label.family="Helvetica")

G.degree <- degree(G, mode="in")
set.seed(888)
com <- cluster_infomap(G)
G <- set_graph_attr(G, "layout", layout.fruchterman.reingold(G))
nodes <- 1:60
cluster1 <- nodes[com$membership == 1]
cluster2 <- nodes[com$membership == 2]
cluster3 <- nodes[com$membership == 3]
cluster4 <- nodes[com$membership == 4]
V(G)[cluster1]$color <- "#2DA5DB"
V(G)[cluster2]$color <- "#37BDA7"
V(G)[cluster3]$color <- "#E50328"
V(G)[cluster4]$color <- "orchid4"
plot(G, vertex.size=(log(G.degree))*5+5, edge.arrow.size=0.2, edge.width=0.2, vertex.label.cex=0.42, vertex.label.color="white", vertex.label.family="Helvetica", edge.curved=TRUE)

Cliques

G.cli <- cliques(G, min = 5, max = NULL)

# Set subgraph members
clique1 <- as.vector(G.cli[[1]])
clique2 <- as.vector(G.cli[[2]])
clique3 <- as.vector(G.cli[[3]])
clique4 <- as.vector(G.cli[[4]])

# Add edge attribute id values
E(G)$id <- seq(ecount(G))

# Extract supgraph
sg.c1 <- induced.subgraph(graph=G,vids=clique1)
sg.c1.Id <- E(sg.c1)$id
sg.c2 <- induced.subgraph(graph=G,vids=clique2)
sg.c2.Id <- E(sg.c2)$id
sg.c3 <- induced.subgraph(graph=G,vids=clique3)
sg.c3.Id <- E(sg.c3)$id
sg.c4 <- induced.subgraph(graph=G,vids=clique4)
sg.c4.Id <- E(sg.c4)$id

# Set graph and subgraph edge and node colors and sizes
E(G)$color="grey"
V(G)$color="darkgray" 
V(G)$label.color="white"
E(G)[sg.c1.Id]$color <- "green"
V(G)[clique1]$color <- "green"
E(G)[sg.c2.Id]$color <- "red"
V(G)[clique2]$color <- "red"
E(G)[sg.c3.Id]$color <- "orange"
V(G)[clique3]$color <- "orange"
E(G)[sg.c4.Id]$color <- "blue"
V(G)[clique4]$color <- "blue"
# Set seed value
set.seed(40041)

# Set layout options
l <- layout_as_tree(G)

# Plot graph and subgraph
plot.igraph(x=G,layout=l, vertex.size=15, edge.arrow.size=0.2, edge.width=0.2, vertex.label.cex=0.42, vertex.label.family="Helvetica")

#Reset graph parameters
E(G)$color="grey"
V(G)$color="darkblue" 

We can see for the 4 largest cliques (of size 5), the orange and red clique are overlapping (node 54 is in red but not orange, and node 55 is in orange but not red).

cluster clique
green green
yellow red
yellow orange
blue blue

Other Questions

Plot for friend graph with size = in degree.

set.seed(48)
layoutfr <- layout.fruchterman.reingold(G)
G.degree <- degree(G, mode="in")
G <- set_graph_attr(G, "layout", layoutfr)
plot(G, vertex.size=G.degree*2, edge.arrow.size=0.2, edge.width=0.2, vertex.label.cex=0.42, vertex.label.color="white", vertex.label.family="Helvetica")

Advice Graph

Creative Graph

Implementation Graph

Influence Graph

Network Measures

The most basic set of measures would be the in degree for each of the relevant questions.

Below is a table with the ranking of nodes by in degree for each of the questions.

indegreetable <- data.frame(
          friendship    =order(G.degree, decreasing = TRUE),
          advice        =order(G.adv.degree, decreasing = TRUE),
          creativity    =order(G.cr.degree, decreasing = TRUE),
          influence     =order(G.infl.degree, decreasing = TRUE),
          implementation=order(G.imp.degree, decreasing = TRUE))
kable(indegreetable)
friendship advice creativity influence implementation
33 19 7 21 33
17 22 33 7 21
14 34 21 30 7
19 17 19 52 19
21 33 50 20 30
46 46 20 34 46
51 23 30 19 20
29 5 51 33 22
7 14 25 22 25
22 21 28 2 52
25 11 6 14 2
50 26 14 25 14
56 30 42 50 6
59 50 46 1 29
2 57 48 6 48
12 1 49 17 50
20 37 59 23 17
28 51 22 9 18
48 55 24 18 1
52 24 57 24 26
6 29 13 28 57
13 32 15 29 11
18 41 29 41 15
54 49 35 45 16
57 2 39 51 23
58 9 41 56 24
5 28 56 57 31
9 35 16 5 43
16 36 18 8 8
26 43 26 10 9
32 48 38 11 13
35 52 43 15 41
43 12 45 16 42
10 13 52 26 51
11 15 54 38 56
24 16 58 39 5
37 18 60 13 10
39 25 1 37 12
41 42 2 43 32
53 60 8 48 37
55 4 9 54 39
1 6 10 58 40
3 8 17 12 44
23 20 37 32 45
31 31 40 35 53
36 40 53 40 55
38 44 55 49 59
40 53 3 53 27
42 54 5 55 28
44 56 11 59 35
45 58 12 4 38
49 3 23 27 49
60 10 34 31 54
4 27 36 42 60
15 39 44 44 4
8 45 4 46 3
30 7 27 60 34
34 38 31 3 36
47 47 32 36 47
27 59 47 47 58

Focusing on the three main questions, and to trade this off against “cost”, we simply divide by the in-degree of the friendship question. Below are the rankings that occur after this transformation. We can see that #27 is at the top, because this node had an in degree of 0 for the friendship question. To remove this anomaly we set the in degree artificially to 0.5.

G.degree[27] <- 0.5
indegreetable <- data.frame(
          creativity    =order(G.cr.degree/G.degree, decreasing = TRUE),
          influence     =order(G.infl.degree/G.degree, decreasing = TRUE),
          implementation=order(G.imp.degree/G.degree, decreasing = TRUE))
kable(indegreetable)
creativity influence implementation
30 30 30
8 34 8
15 8 27
42 52 15
49 21 1
7 20 23
27 7 31
34 1 7
20 15 20
50 23 52
21 27 6
24 45 21
38 38 2
45 22 22
60 24 25
19 41 42
39 19 19
41 2 46
6 6 11
28 9 24
33 10 26
1 11 33
25 39 18
35 25 48
40 50 14
47 18 16
48 57 40
57 5 41
51 14 43
59 16 44
13 26 45
16 37 50
26 33 57
43 28 29
10 40 9
22 49 10
37 56 37
53 43 39
55 29 53
14 4 55
46 13 13
3 17 38
18 51 49
23 53 60
36 54 5
44 55 32
54 58 17
58 48 4
56 32 56
9 35 12
52 31 35
29 42 51
4 44 59
11 60 54
2 12 28
5 59 3
31 46 34
12 3 36
17 36 47
32 47 58

To see how these rankings are formed, the raw data is included into the table

G.degree[27] <- 0.5
indegreetable <- data.frame(
          creativity    =order(G.cr.degree/G.degree, decreasing = TRUE),
          frienddegree.cr  =as.integer(G.degree[order(G.cr.degree/G.degree, decreasing=TRUE)]),
          crdegree      =as.integer(G.cr.degree[order(G.cr.degree/G.degree, decreasing=TRUE)]),
          influence     =order(G.infl.degree/G.degree, decreasing = TRUE),
          frienddegree.infl  =as.integer(G.degree[order(G.infl.degree/G.degree, decreasing=TRUE)]),
          infldegree    =as.integer(G.infl.degree[order(G.infl.degree/G.degree, decreasing=TRUE)]),
          implementation=order(G.imp.degree/G.degree, decreasing = TRUE),
          frienddegree.imp  =as.integer(G.degree[order(G.imp.degree/G.degree, decreasing=TRUE)]),
          impldegree    =as.integer(G.imp.degree[order(G.imp.degree/G.degree, decreasing=TRUE)]))
kable(indegreetable)
creativity frienddegree.cr crdegree influence frienddegree.infl infldegree implementation frienddegree.imp impldegree
30 1 11 30 1 17 30 1 13
8 1 3 34 1 13 8 1 4
15 2 5 8 1 4 27 0 2
42 3 7 52 7 16 15 2 5
49 3 7 21 10 22 1 3 6
7 8 17 20 7 15 23 3 5
27 0 1 7 8 17 31 3 5
34 1 2 1 3 6 7 8 13
20 7 12 15 2 4 20 7 11
50 8 13 23 3 6 52 7 11
21 10 15 27 0 1 6 6 9
24 4 6 45 3 5 21 10 15
38 3 4 38 3 4 2 7 10
45 3 4 22 8 10 22 8 11
60 3 4 24 4 5 25 8 11
19 10 13 41 4 5 42 3 4
39 4 5 19 10 12 19 10 13
41 4 5 2 7 8 46 10 13
6 6 7 6 6 6 11 4 5
28 7 8 9 5 5 24 4 5
33 15 16 10 4 4 26 5 6
1 3 3 11 4 4 33 15 18
25 8 8 39 4 4 18 6 7
35 5 5 25 8 7 48 7 8
40 3 3 50 8 7 14 10 10
47 1 1 18 6 5 16 5 5
48 7 7 57 6 5 40 3 3
57 6 6 5 5 4 41 4 4
51 10 9 14 10 8 43 5 5
59 8 7 16 5 4 44 3 3
13 6 5 26 5 4 45 3 3
16 5 4 37 4 3 50 8 8
26 5 4 33 15 11 57 6 6
43 5 4 28 7 5 29 9 8
10 4 3 40 3 2 9 5 4
22 8 6 49 3 2 10 4 3
37 4 3 56 8 5 37 4 3
53 4 3 43 5 3 39 4 3
55 4 3 29 9 5 53 4 3
14 10 7 4 2 1 55 4 3
46 10 7 13 6 3 13 6 4
3 3 2 17 12 6 38 3 2
18 6 4 51 10 5 49 3 2
23 3 2 53 4 2 60 3 2
36 3 2 54 6 3 5 5 3
44 3 2 55 4 2 32 5 3
54 6 4 58 6 3 17 12 7
58 6 4 48 7 3 4 2 1
56 8 5 32 5 2 56 8 4
9 5 3 35 5 2 12 7 3
52 7 4 31 3 1 35 5 2
29 9 5 42 3 1 51 10 4
4 2 1 44 3 1 59 8 3
11 4 2 60 3 1 54 6 2
2 7 3 12 7 2 28 7 2
5 5 2 59 8 2 3 3 0
31 3 1 46 10 1 34 1 0
12 7 2 3 3 0 36 3 0
17 12 3 36 3 0 47 1 0
32 5 1 47 1 0 58 6 0

There are also network-specific properties that are important for the choice of teams. Below rankings are created from weighted averages of standardised metrics, including network proporties from the friendship graph.

For the Design team it would be useful to have:

dfpartymatrix <- fulldata[,1:3]
levels(dfpartymatrix$style) <- c("cosy","mixer","party")
levels(dfpartymatrix$guestlist) <- c("exclusive","expansive","tight")
##define metric for design team based on party choices, from stage/style matrix in slides
dfpartymatrix$designpartymetric <- 0
##add party type metrics
dfpartymatrix$designpartymetric[dfpartymatrix$guestlist == "exclusive"] <- 2
dfpartymatrix$designpartymetric[dfpartymatrix$guestlist == "expansive"] <- 3
dfpartymatrix$designpartymetric[dfpartymatrix$guestlist == "tight"] <- 1

##add leader metric
dfpartymatrix$designleaderscore <- 0
dfpartymatrix$designleaderscore[as.vector(adjacent_vertices(G.cr, 30, mode ="out")[[1]])] <- 1
standardise <- function(x){(x-min(x))/(max(x)-min(x))}

fr.btwn.centr <- as.numeric(betweenness(G))

creativitymetric <- (standardise(fr.btwn.centr)*0.15 + 
                       standardise(G.cr.degree)*0.55 +
                      standardise(dfpartymatrix$designpartymetric)*0.15 +
                      dfpartymatrix$designleaderscore*0.15 )/standardise(G.degree)

designtable <- data.frame(
          node   =order(creativitymetric, decreasing = TRUE),
          creativitymetric =creativitymetric[order(creativitymetric, decreasing=TRUE)],
          creativitydegree =as.integer(G.cr.degree[order(creativitymetric, decreasing=TRUE)]),
          frienddegree  =as.integer(G.degree[order(creativitymetric, decreasing=TRUE)]),
          btwncentrality = fr.btwn.centr[order(creativitymetric, decreasing=TRUE)])
kable(designtable)
node creativitymetric creativitydegree frienddegree btwncentrality
27 Inf 1 0 0.00000
30 14.4964337 11 1 13.47460
34 5.5766639 2 1 17.42599
8 3.3921420 3 1 106.04675
15 2.7791667 5 2 0.00000
49 2.4292618 7 3 137.64460
39 1.8863339 5 4 39.19423
45 1.7227231 4 3 96.53696
20 1.6812143 12 7 166.09037
38 1.6645686 4 3 74.48627
50 1.5879581 13 8 239.40071
7 1.4237099 17 8 80.05487
24 1.4183667 6 4 45.06039
3 1.3886613 2 3 121.06502
44 1.3861846 2 3 120.12593
1 1.3113743 3 3 16.16201
42 1.2916701 7 3 36.18082
57 1.2440341 6 6 329.88131
31 1.1796985 1 3 117.42959
23 1.1614107 2 3 34.89756
52 1.1050661 4 7 202.87577
26 1.0916006 4 5 188.35695
60 1.0899515 4 3 186.48780
21 1.0622683 15 10 142.33039
37 1.0542794 3 4 78.58043
28 0.9879882 8 7 114.94440
35 0.9778812 5 5 35.14418
47 0.9531921 1 1 72.28512
16 0.9487869 4 5 90.88476
11 0.8821614 2 4 62.81051
41 0.8291145 5 4 137.73882
58 0.7868719 4 6 99.72016
13 0.7827005 5 6 185.58332
33 0.7644160 16 15 217.26193
48 0.7513743 7 7 122.21650
19 0.7244627 13 10 136.67637
6 0.7061301 7 6 135.45469
2 0.6655539 3 7 175.06082
22 0.6411356 6 8 186.37606
46 0.6135085 7 10 100.51236
51 0.6087607 9 10 272.35707
56 0.5978503 5 8 47.79516
25 0.5416014 8 8 86.89877
9 0.5381137 3 5 216.07405
59 0.5178148 7 8 135.43881
29 0.5169706 5 9 199.14212
43 0.4794138 4 5 100.41275
18 0.4669831 4 6 162.75583
12 0.4634222 2 7 51.38665
40 0.4610819 3 3 23.63464
55 0.4590250 3 4 92.47484
54 0.4371956 4 6 137.90757
10 0.4089746 3 4 65.90589
36 0.3459370 2 3 55.57248
17 0.3442103 3 12 119.29474
14 0.3148026 7 10 0.00000
53 0.2848214 3 4 0.00000
5 0.2444942 2 5 91.27267
4 0.2309100 1 2 52.53303
32 0.1079593 1 5 73.68362

For the Lobbying team it would be useful to have:

dfpartymatrix$lobbypartymetric <- 0
##add party type metrics
dfpartymatrix$lobbypartymetric[dfpartymatrix$guestlist == "exclusive"] <- 3
dfpartymatrix$lobbypartymetric[dfpartymatrix$guestlist == "expansive"] <- 3
dfpartymatrix$lobbypartymetric[dfpartymatrix$guestlist == "tight"] <- 1

##add leader metric
dfpartymatrix$lobbyleaderscore <- 0
dfpartymatrix$lobbyleaderscore[as.vector(adjacent_vertices(G.infl, 33, mode ="out")[[1]])] <- 1
fr.eign.centr <- as.numeric(eigen_centrality(G)$vector)

influencemetric <- (standardise(fr.eign.centr)*0.35 + 
                      standardise(G.infl.degree)*0.35 +
                      standardise(dfpartymatrix$lobbypartymetric)*0.15+
                      dfpartymatrix$lobbyleaderscore*0.15)/standardise(G.degree)
influencemetric[27] <- NaN


lobbytable <- data.frame(
          node   =order(influencemetric, decreasing = TRUE),
          influencemetric =influencemetric[order(influencemetric, decreasing=TRUE)],
          influencedegree =as.integer(G.infl.degree[order(influencemetric, decreasing=TRUE)]),
          frienddegree  =as.integer(G.degree[order(influencemetric, decreasing=TRUE)]),
          eigncentrality = fr.eign.centr[order(influencemetric, decreasing=TRUE)])
kable(lobbytable)
node influencemetric influencedegree frienddegree eigncentrality
30 18.5579075 17 1 0.2824265
34 16.7119202 13 1 0.2823795
8 3.8838938 4 1 0.2845182
15 2.2206054 4 2 0.1458528
1 2.0923842 6 3 0.3996524
23 1.8391873 6 3 0.2879860
11 1.7547124 4 4 0.2579766
52 1.6467980 16 7 0.5745472
3 1.6305246 0 3 0.4401284
47 1.5350129 0 1 0.2401134
49 1.5282100 2 3 0.3136156
24 1.5021059 5 4 0.4450061
39 1.4579584 4 4 0.4584425
44 1.4423484 1 3 0.3164431
31 1.3795791 1 3 0.2887602
37 1.3129402 3 4 0.4095977
7 1.2323846 17 8 0.6597561
20 1.1850436 15 7 0.4694557
21 1.1769142 22 10 0.7981309
50 1.1767373 7 8 0.6093845
35 1.1057094 2 5 0.5173991
4 1.0777311 1 2 0.3492070
45 1.0397453 5 3 0.3597986
22 1.0337946 10 8 0.6818688
26 1.0049177 4 5 0.3559966
38 0.9824128 4 3 0.3752081
57 0.9481101 5 6 0.4374619
16 0.9436568 4 5 0.3073649
19 0.8778689 12 10 0.7039080
48 0.8605046 3 7 0.5856534
2 0.8442780 8 7 0.3635735
28 0.8196417 5 7 0.4574079
58 0.7572261 3 6 0.3336447
13 0.7553972 3 6 0.3318702
10 0.7548661 4 4 0.4080203
56 0.7523368 5 8 0.5129516
29 0.7338182 5 9 0.6179031
25 0.7004809 7 8 0.7466455
46 0.6990546 1 10 0.8518746
6 0.6945717 6 6 0.5344624
33 0.6750000 11 15 1.0000000
12 0.6748642 2 7 0.4134802
17 0.6680650 6 12 0.8321731
41 0.5081433 5 4 0.2149901
60 0.5019801 1 3 0.2854089
59 0.4855190 2 8 0.6657073
9 0.4578365 5 5 0.2646960
40 0.4500662 2 3 0.2218188
51 0.4469554 5 10 0.6502959
18 0.4436618 5 6 0.3317099
5 0.4276252 4 5 0.2814075
36 0.3679381 0 3 0.2669875
14 0.3560979 8 10 0.3759439
43 0.3416421 3 5 0.2538447
32 0.3378422 2 5 0.2915228
42 0.3362258 1 3 0.2123069
55 0.3266288 2 4 0.2250004
54 0.3003728 3 6 0.2740721
53 0.1318182 2 4 0.1047173
27 NaN 1 0 0.1543776

For the Implementation team it would be useful to have:

dfpartymatrix$implpartymetric <- 0
##add party type metrics
dfpartymatrix$implpartymetric[dfpartymatrix$guestlist == "exclusive"] <- 2
dfpartymatrix$implpartymetric[dfpartymatrix$guestlist == "expansive"] <- 1
dfpartymatrix$implpartymetric[dfpartymatrix$guestlist == "tight"] <- 3

##add leader metric
dfpartymatrix$implleaderscore <- 0
dfpartymatrix$implleaderscore[as.vector(adjacent_vertices(G.imp, 19, mode ="out")[[1]])] <- 1
fr.cls.centr <- closeness(G)

implementationmetric <- (standardise(fr.cls.centr)*0.15 +
                         standardise(G.imp.degree)*0.55 +
                         standardise(dfpartymatrix$implpartymetric)*0.15 +
                         dfpartymatrix$implleaderscore*0.15)/standardise(G.degree)
implementationmetric[27] <- NaN

impltable <- data.frame(
          node   =order(implementationmetric, decreasing = TRUE),
          implementationmetric =implementationmetric[order(implementationmetric, decreasing=TRUE)],
          influencedegree =as.integer(G.infl.degree[order(implementationmetric, decreasing=TRUE)]),
          frienddegree  =as.integer(G.degree[order(implementationmetric, decreasing=TRUE)]),
          closenesscentrality = fr.cls.centr[order(implementationmetric, decreasing=TRUE)])
kable(impltable)
node implementationmetric influencedegree frienddegree closenesscentrality
30 14.5409839 17 1 0.0047170
8 10.8419282 4 1 0.0046083
47 7.2830803 0 1 0.0045872
34 3.0991728 13 1 0.0048309
4 2.7837543 1 2 0.0048544
1 2.4230329 6 3 0.0038760
15 2.2697639 4 2 0.0037736
42 2.1712930 1 3 0.0046296
40 1.9911634 2 3 0.0046083
45 1.9608655 5 3 0.0043860
60 1.8227448 1 3 0.0046729
38 1.7658397 4 3 0.0042553
24 1.6257978 5 4 0.0040984
41 1.4943652 5 4 0.0040486
36 1.4866695 0 3 0.0048077
31 1.4785152 1 3 0.0046296
23 1.4505993 6 3 0.0044248
55 1.4285479 2 4 0.0046729
10 1.3826802 4 4 0.0042017
6 1.3699517 6 6 0.0043103
43 1.3063609 3 5 0.0046512
22 1.2620448 10 8 0.0041841
18 1.2410864 5 6 0.0048309
9 1.1892893 5 5 0.0044053
25 1.1186487 7 8 0.0042194
44 1.1182827 1 3 0.0045872
32 1.0983441 2 5 0.0045045
5 1.0836447 4 5 0.0043103
11 1.0342450 4 4 0.0044053
53 1.0011905 2 4 0.0002825
19 0.9697070 12 10 0.0040323
20 0.9689679 15 7 0.0044643
52 0.9648628 16 7 0.0043860
29 0.9615149 5 9 0.0042918
49 0.9527448 2 3 0.0046729
7 0.9492541 17 8 0.0042735
26 0.9315934 4 5 0.0047847
48 0.9189536 3 7 0.0042194
2 0.9140500 8 7 0.0047170
21 0.8401103 22 10 0.0042017
54 0.8232093 3 6 0.0045872
16 0.8150246 4 5 0.0045455
13 0.7946349 3 6 0.0047170
33 0.7942022 11 15 0.0042918
37 0.7718289 3 4 0.0043103
57 0.7622128 5 6 0.0047847
46 0.7487590 1 10 0.0042553
39 0.7479513 4 4 0.0040650
14 0.6953216 8 10 0.0002825
50 0.6616486 7 8 0.0044444
59 0.6510344 2 8 0.0043290
3 0.5953385 0 3 0.0046512
51 0.5560459 5 10 0.0042017
35 0.4832831 2 5 0.0040650
12 0.3867233 2 7 0.0037594
17 0.3832304 6 12 0.0041152
56 0.3828496 5 8 0.0035088
28 0.3185609 5 7 0.0037594
58 0.2374110 3 6 0.0041152
27 NaN 1 0 0.0066667

Notes

  • tkplot doesn’t work well on mac computers (requires Xquartz and loads the graph outside of the file.)
  • Spin clustering (4 or 5 spins) provides a very similar result to leading eigenvector clustering and walking trap clustering in this case
  • louvain community detection only works for undirected graphs (same with fast_greedy)
  • There are no maximally connected cliques of 6
  • layout_with_kk makes a nice layout, but layout.fruchterman.reingold puts the clusters together nicely.